 % 初始化
clear
clc
warning off
tic;

load('./importance_basic.mat')
% 设定删除重要度的数量
n = 0;

% 找到重要度最低的 n 项的索引
[~, sorted_idx] = sort(importance);
lowest_n_idx = sorted_idx(1:n);

% 将这些特征的重要度设为零值
importance(lowest_n_idx) = 0;

% 保留时域特征和互信息特征原始重要性

% 第二部分：频域特征划分为18*5组，并除以频带宽度求平均
num_channels = 18;
freq_bands = {1:3, 4:7, 8:12, 13:29, 30:70};
group_importance_freq = zeros(num_channels, length(freq_bands));

for ch = 1:num_channels
    for band = 1:length(freq_bands)
        % 获取当前频带内的频率索引
        band_freqs = freq_bands{band};
        for f = band_freqs
            idx = (f-1) * num_channels + ch + 18 * 10; % 索引从时域特征后的部分开始
            group_importance_freq(ch, band) = group_importance_freq(ch, band) + importance(idx);
        end
        % 对该频带重要性进行求平均
        group_importance_freq(ch, band) = group_importance_freq(ch, band) / length(band_freqs);
    end
end

% 展平成一维数组
group_importance_freq = reshape(group_importance_freq', 1, []);

% 合并时域特征、频域特征、和互信息特征的重要性
group_importance = [importance(1:18*10), group_importance_freq, importance(18*80+1:end)];

% 计算并输出每组时域特征剩余的重要性
disp('每组时域特征剩余的重要性：');
remaining_features_per_group = reshape(importance(1:18*10), num_channels, 10);
for i = 1:10
    remaining_count = sum(remaining_features_per_group(:, i) > 0); % 找出剩余的特征索引
    disp(['特征组 ', num2str(i), ': 剩余特征数量 = ' num2str(remaining_count)]);
end
% 绘制特征重要性
figure;
hold on;

ylim([0, 0.65]);  % 设置 y 轴的范围，视重要度的范围而定

% 设置颜色
time_feature_color = 'b'; % 时域特征颜色
mutual_info_feature_color = 'r'; % 互信息特征颜色

% 手动设置18种通道颜色
channel_colors = [
    [0, 0.4470, 0.7410];    % 蓝色
    [0.8500, 0.3250, 0.0980]; % 橙色
    [0.9290, 0.6940, 0.1250]; % 黄色
    [0.4940, 0.1840, 0.5560]; % 紫色
    [0.4660, 0.6740, 0.1880]; % 绿色
    [0.3010, 0.7450, 0.9330]; % 青色
    [0.6350, 0.0780, 0.1840]; % 红色
    [0.75, 0, 0.75];          % 粉红色
    [0, 1, 0];                % 亮绿色
    [1, 0, 0];                % 亮红色
    [0, 0, 1];                % 亮蓝色
    [1, 0.5, 0];              % 深橙色
    [0.5, 0, 0.5];            % 深紫色
    [0.5, 0.5, 0];            % 橄榄色
    [0, 0.5, 0.5];            % 深青色
    [0.25, 0.25, 0.25];       % 灰色
    [0.5, 0.5, 1];            % 淡蓝色
    [1, 1, 0.5]               % 淡黄色
];

% 绘制时域特征
bar(1:(18*10), group_importance(1:(18*10)), 'FaceColor', time_feature_color, 'DisplayName', '时域特征');

% 绘制频域特征
freq_start_idx = 18 * 10;
% 初始化x轴索引为1
x_idx = 1;
legend_info = false(1, num_channels); % 用于控制每个通道只显示一次图例
for ch = 1:num_channels
    for band = 1:length(freq_bands)
        % 计算频域特征的索引
        idx = freq_start_idx + (ch-1) * length(freq_bands) + band;
        % 绘制频域特征
        if ~legend_info(ch)
            bar(idx, group_importance(idx), 'FaceColor', channel_colors(ch,:), 'DisplayName', ['通道 ', num2str(ch)]);
            legend_info(ch) = true;
        else
            bar(idx, group_importance(idx), 'FaceColor', channel_colors(ch,:) ,'HandleVisibility', 'off');
        end
        x_idx=x_idx+1;
    end
end

%{
% 绘制互信息特征
mi_start_idx = freq_start_idx + num_channels * length(freq_bands) + 1;
bar(mi_start_idx:(mi_start_idx + 153 - 1), group_importance(mi_start_idx:(mi_start_idx + 153 - 1)), 'FaceColor', mutual_info_feature_color, 'DisplayName', '互信息特征');
%}
% 计算删除的特征占总特征的百分比
deleted_percentage = round(n / length(importance) * 100);
xlabel('特征索引');
ylabel('重要性');

% 设置标题，展示删除的百分比
%title(['(a) 删除', num2str(deleted_percentage), '%最不重要特征']);
%legend('Location', 'bestoutside');
grid off;

% 修改x轴和y轴标尺的字体大小
set(gca, 'FontSize', 50);


% 修改图例的字体大小
legend('Location', 'bestoutside', 'FontSize', 20);

% 设置轴的边框属性，隐藏上边界和右边界的刻度线
set(gca, 'XAxisLocation', 'bottom', 'YAxisLocation', 'left','LineWidth', 1); % 保证 x 轴和 y 轴的位置

hold off;
%{
% 转换重要度为二维矩阵，行数为通道数，列数为频带数
importance_matrix = reshape(group_importance_freq, length(freq_bands), num_channels);


% 绘制三维地形图
figure;
surf(importance_matrix); % 绘制3D表面图
colorbar;                % 显示颜色条
title('特征重要性三维地形图');
xlabel('通道索引');
ylabel('频带索引');
zlabel('重要性');
shading interp;          % 平滑表面颜色
%}
elapsedTime = toc;
disp(['代码执行时间：', num2str(elapsedTime), ' 秒']);
